1. Field of the Invention
The present invention relates to software development and, more particularly, to identifying portions of code of a computer program that may cause needless switching between tasks.
2. Description of the Related Art
Many programming languages, operating systems, and other software development environments support what are known as “threads” of execution. Threads are similar to processes, in that each represents a single sequence of computer program instructions that can be executed in parallel with other sequences of instructions. Threads are executed in parallel within a computer system using technologies such as time slicing and preemption. In essence, threads provide a mechanism by which a computer program can split itself into two or more simultaneously running tasks.
Because threads are capable of operating in parallel, there may be a scenario in which more than one thread tries to access to a given computer resource, such as a portion of memory, at the same time. In the typical case, a thread requires constantly unshared access to a portion of memory during the time while a particular set of instructions is executing. That is, the thread reads and writes to a given portion of memory. During that time, if another thread writes to the same portion of memory, the data may become inaccurate, “clobbered”, or otherwise corrupted.
To avoid such a condition, synchronization objects, also referred to as “locks”, usually are employed. Examples of synchronization objects can include, but are not limited to, defining a portion of code as a “critical section” which requires the use of a particular application programming interface (API), semaphores, or the like, for accessing the resource. In general, once a synchronization object is engaged by a thread A, the synchronization object prevents threads B and C, for example, from also engaging the synchronization object. This causes threads B and C, which must engage the synchronization object, to block or wait until the synchronization object is removed or disengaged by thread A.
Task switching refers to the situation in which a computer system executes one thread, and prior to completing execution of that thread, switches contexts to begin executing a different thread. Task switching can occur under several different circumstances. For example, one situation in which task switching can occur is when a thread runs of out time. A time slicing computer system allots a predetermined amount of time to executing each thread. When that time period expires, the computer system switches to begin executing another task. While task switching does allow parallel execution of multiple threads, overly frequent task switching can cause execution of thread management tasks to consume a large percentage of CPU time. This can substantially degrade performance of a computer program.
Another situation in which a computer system switches tasks is attributable to what can be referred to as a “blocking condition”. A blocking condition occurs when a thread needs access to a resource that is protected by a synchronization object engaged by another thread. So long as that resource is thus protected, the blocked thread is not given the opportunity to run. A blocking condition can result in failure of threads to perform actual work. This too can substantially degrade effective performance of a computer system.
It would be beneficial to provide a solution which can detect portions of software code that cause potentially unnecessary task switching within a computer system.